// ignore_for_file: slash_for_doc_comments

import 'package:dio/dio.dart';
import 'package:enjoy_plus/utils/event_bus.dart';
import 'package:enjoy_plus/utils/token.dart';

//1.创建网络请求的类
class NetworkService {
  final _dio = Dio();

//2.初始化网络请求的配置
  NetworkService() {
    //请求基地址
    _dio.options.baseUrl = 'https://live-api.itheima.net';
    // 设置连接超时时间
    _dio.options.connectTimeout = const Duration(seconds: 5);
    // 设置接收超时时间
    _dio.options.receiveTimeout = const Duration(seconds: 3);
    // 设置请求头
    _dio.options.headers = {'Content-Type': 'application/json;charset=UTF-8'};
    // 添加请求和响应拦截器
    _addInterceptors();
  }
//3.定义get,post请求方法
  /** 
   * 发起GET请求
   * [url] 请求的URL
   * [params] 请求的查询参数
   * 返回解析后的响应数据或错误信息
   */
  Future get(String url, {Map<String, dynamic>? params}) async {
    try {
      final response = await _dio.get(url, queryParameters: params);
      return handleResponse(response);
    } catch (e) {
      return handleError(e);
    }
  }

  /** 
   * 发起POST请求
   * [url] 请求的URL
   * [data] 请求的主体数据
   * 返回解析后的响应数据或错误信息
   */
  Future post(String url, dynamic data) async {
    try {
      final response = await _dio.post(url, data: data);
      return handleResponse(response);
    } catch (e) {
      return handleError(e);
    }
  }

  //  添加 delete 方法
  /**
   * 发起 DELETE 请求
   * [url] 请求的 URL
   * [data] 请求的主体数据
   * [params] 请求的查询参数
   * 返回解析后的响应数据或错误信息
   */
  Future delete(String url,
      {Map<String, dynamic>? params, dynamic data}) async {
    try {
      final response =
          await _dio.delete(url, queryParameters: params, data: data);
      return handleResponse(response);
    } catch (e) {
      return handleError(e);
    }
  }

//4.定义统一的请求处理方法
  //统一处理成功响应
  handleResponse(Response response) {
    if (response.statusCode! >= 200 && response.statusCode! < 300) {
      return response.data;
    } else {
      throw Exception('网络请求失败，状态码：${response.statusCode}');
    }
  }

  //统一处理错误响应
  handleError(e) {
    if (e is DioException) {
      if (e.type == DioExceptionType.connectionTimeout ||
          e.type == DioExceptionType.receiveTimeout) {
        throw Exception('网络连接超时，请检查您的网络设置');
      } else if (e.type == DioExceptionType.badResponse) {
        if (e.response?.statusCode == 401) {
          //清除token
          TokenManager().reoveToken();
          //跳转登录页面
          eventBus.fire(Logout());
        } else {
          throw Exception('响应错误');
        }
      } else {
        throw Exception('网络请求失败，$e');
      }
    } else {
      throw Exception('网络请求失败，$e');
    }
  }

  //5.配置请求和响应拦截器
  void _addInterceptors() {
    _dio.interceptors.add(InterceptorsWrapper(
      onRequest: (options, handler) async {
        // 请求拦截器：添加公共请求参数、token 等
        final token = TokenManager().getToken() ?? '';
        if (token.isNotEmpty) {
          options.headers['Authorization'] = 'Bearer $token';
        }
        return handler.next(options);
      },
      onResponse: (response, handler) {
        // 响应拦截器：统一处理成功响应
        return handler.next(response);
      },
      onError: (DioException error, handler) {
        // 响应拦截器：统一处理错误响应
        return handler.next(error);
      },
    ));
  }
}

//6.创建请求实例对象给外部使用
final http = NetworkService();
